"""
AI 模型是如何处理字符数据的
视频 音频  NLP
AI 模型本质是一个矩阵
"""
import os

from transformers import BertTokenizer

path = os.path.dirname(os.path.abspath(__file__))
snapshot_dir = os.path.join(path, "model/bert-base-chinese/models--bert-base-chinese/snapshots")
versions = os.listdir(snapshot_dir)
latest_version = sorted(versions)[-1]
model_dir = os.path.join(snapshot_dir, latest_version)

# 加载字典和分词器
token = BertTokenizer.from_pretrained(model_dir)
print(token)
# print(token.vocab)  # 字典


# 批量编码语句
sentences = [
    "白日依山尽，",
    "如果你还没有个人网站，可以搭建一个！你可以使用任意喜欢的建站工具，比如 WordPress、micro.blog、omg.lol 等，不需要编程或复杂配置即可快速上手。当然，喜欢挑战的话也可以自己编写代码。"
]

# 批量编码句子
token_ids = token.batch_encode_plus(
    batch_text_or_text_pairs=[sentences[0], sentences[1]],
    add_special_tokens=True,   # 是否添加 [CLS] 和 [SEP] 特殊字符
    truncation=True,  # 当句子长度大于 max_length（上限是 model_max_length） 时，截断句子
    max_length=15,   # 句子最大长度
    padding="max_length",  # 填充方式，一律补 0 到 max_length
    return_tensors=None,  # 可取值 "pt" 或 "tf"， 默认为 list
    # 返回结果
    return_attention_mask=True,
    return_token_type_ids=True,
    return_special_tokens_mask=True,
    # 返回序列长度
    return_length=True,
)

# input_ids 这是编码后的词
# token_type_ids 第一个句子和特殊符号的位置是 0，第二个句子的位置是 1（）只针对于上下文编码
# special_tokens_mask   特殊符号的位置是 1，其他位置是 0
# length
# attention_mask
for k, v in token_ids.items():
    print(k, ":", v)


# 解码文本数据
print(token.decode(token_ids["input_ids"][0]), token.decode(token_ids["input_ids"][1]))